#ifndef DATABASE_MANAGER_H
#define DATABASE_MANAGER_H

#include <QSqlDatabase>
#include <QString>
#include <QVector>
#include "state_info.h"
#include "alarm_rule.h"
/**
 * @brief 数据库管理类，使用单例模式管理数据库连接
 */
class DatabaseManager
{
public:
    /**
     * @brief 获取数据库实例
     * @return QSqlDatabase& 数据库引用
     */
    static QSqlDatabase &getInstance();

    /**
     * @brief 初始化数据库连接
     * @return bool 初始化是否成功
     */
    static bool initialize();

    /**
     * @brief 关闭数据库连接
     */
    static void close();

    /**
     * @brief 查询所有点表信息
     * @return QVector<PointInfo> 点信息列表
     */
    static QVector<PointInfo> queryAllPoints();

    /**
     * @brief 查询点表信息
     * @param station_id 场站ID
     * @param point_type 点类型
     * @return QVector<PointInfo> 点信息列表
     */
    static QVector<PointInfo> queryPoints(int64_t station_id, int point_type);

    /**
     * @brief 删除点表信息
     * @param station_id 场站ID
     * @param point_addr 点地址
     * @return bool 删除是否成功
     */
    static bool deletePoints(int64_t station_id, int64_t point_addr);

    /**
     * @brief 插入点表信息
     * @param station_id 场站ID
     * @param point_type 点类型
     * @param point_addr 点地址
     * @param point_desc 点描述
     * @param direction 方向
     * @return int 错误码
     */
    static int insertPoint(int64_t station_id, int point_type, int point_addr, QString point_desc, int direction);

    /**
     * @brief 查询报文信息
     * @param station_id 场站ID
     * @param point_ctrl 控制点
     * @return int64_t 关联点
     */
    static int64_t queryPointGrab(int64_t station_id, int64_t point_ctrl);

    /**
     * @brief 插入点表关联关系
     * @param station_id 场站ID
     * @param point_ctrl 控制点
     * @param point_grab 关联点
     * @return int 错误码
     */
    static int insertPointRelation(int64_t station_id, int64_t point_ctrl, int64_t point_grab);

    /**
     * @brief 删除点表关联关系
     * @param station_id 场站ID
     * @param point_ctrl 控制点
     * @return bool 删除是否成功
     */
    static bool deletePointRelation(int64_t station_id, int64_t point_ctrl);

    /**
     * @brief 反向删除点表关联关系
     * @param station_id 场站ID
     * @param point_grab 关联点
     * @return bool 删除是否成功
     */
    static bool reverseDeletePointRelation(int64_t station_id, int64_t point_grab);

    /**
     * @brief 查询所有点表信息
     * @return QVector<PointInfo> 点信息列表
     */
    static QVector<PointInfo> queryAllPointRelation();

    /**
     * @brief 保存点表地址配置
     * @param station_id 场站ID
     * @param yx_addr_start 遥信起始地址
     * @param yc_addr_start 遥测起始地址
     * @param power_addr_start 功率起始地址
     * @param yk_addr_start 遥控起始地址
     * @param yt_addr_start 遥调起始地址
     * @param soe_addr_start SOE起始地址
     * @return bool 操作是否成功
     */
    static bool savePointAddressConfig(int64_t station_id, 
                                     int64_t yx_addr_start,
                                     int64_t yc_addr_start,
                                     int64_t power_addr_start,
                                     int64_t yk_addr_start,
                                     int64_t yt_addr_start,
                                     int64_t soe_addr_start);

    /**
     * @brief 初始化点表地址配置
     * @param station_id 场站ID
     * @return bool 操作是否成功
     */
    static bool initPointAddressConfig(int64_t station_id);

    /**
     * @brief 删除点表地址配置
     * @param station_id 场站ID
     * @return bool 操作是否成功
     */
    static bool deletePointAddressConfig(int64_t station_id);   

    /**
     * @brief 查询点表地址配置
     * @param station_id 场站ID
     * @param is_ok 是否成功
     * @return StateInfo::PointSetting 点表地址配置
     */
    static StateInfo::PointSetting queryPointAddressConfig(int64_t station_id, bool &is_ok);

    /**
     * @brief 查询所有告警规则
     * @return QVector<AlarmRule> 告警规则列表
     */
    static QVector<AlarmRule> queryAllAlarmRules();

    /**
     * @brief 根据站ID查询告警规则
     * @param station_id 场站ID
     * @return QVector<AlarmRule> 告警规则列表
     */
    static QVector<AlarmRule> queryAlarmRules(int64_t station_id);

    /**
     * @brief 插入告警规则
     * @param alarm_rule 告警规则
     * @return int 错误码 0:成功，其他:失败
     */
    static int insertAlarmRule(AlarmRule alarm_rule);

    /**
     * @brief 删除告警规则
     * @param id 告警规则ID
     * @return int 错误码 0:成功，其它:失败
     */
    static int deleteAlarmRule(int id);

    /**
     * @brief 根据站地址和点号查询点表的描述
     * @param station_id 场站ID
     * @param point_addr 点地址
     * @return QString 点表描述
     */
    static QString queryPointDesc(int64_t station_id, int64_t point_addr);

private:
    /**
     * @brief 创建表
     * @details 自动判断表是否存在，不存在则创建
     */
    static void ddl();

private:
    DatabaseManager() = delete;
    ~DatabaseManager() = delete;
    DatabaseManager(const DatabaseManager &) = delete;
    DatabaseManager &operator=(const DatabaseManager &) = delete;
};

#endif // DATABASE_MANAGER_H